2015-09-11 22:52:16 weixin_34389926 阅读数 21
  • iOS开发教程之OC语言

    Objective-C是扩充C的面向对象编程语言,iOS开发是用的Objective-C语言,本专题更系统的讲解Objective-C语言当中的一些要点,类的封装、基本数据结构(NSString、NSData)、继承、内存管理(retain点语法、MyArray、AutoreleasePool、浅拷贝详述、深拷贝详述)等内容。

    40464 人正在学习 去看看 欧阳坚
开发环境:OS X Yosemite 10.10.3 + Xcode 6.4
开发语言:Swift 1.2

信鸽推送SDK2.4.0Swift1.2DemoGit地址

使用方法


  • XinGeSDK2_4_0文件拷贝到工程中

  • 拷贝XinGeAppDelegate.swift到工程中

  • 工程名-Bridging-Header.h桥接文件中,添加

#import "XGSetting.h"
#import "XGPush.h"
  • AppDelegate继承XinGeAppDelegate,并且两者有且只有一个var window: UIWindow?属性。继承的方法前需要添加override关键字,例如:

import UIKit

@UIApplicationMain
class AppDelegate: XinGeAppDelegate{
    
    var window: UIWindow?
    
    override func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool {
        
        // 在此处,可以设置UI等操作。
        
        return super.application(application, didFinishLaunchingWithOptions: launchOptions)
    }
}
  • 腾讯信鸽官网创建应用并提交证书。

  • XinGeAppDelegate.swift文件中填写ACCESS IDACCESS KEY

添加必要的框架:


  • CoreGraphics.framework

  • CoreTelephony.framework

  • SystemConfiguration.framework

  • libz.dylib

  • CFNetwork.framework

  • libsqlite3.dylib

错误及解决

  • Xcode输出信息:You've implemented -[<UIApplicationDelegate> application:didReceiveRemoteNotification:fetchCompletionHandler:], but you still need to add "remote-notification" to the list of your supported UIBackgroundModes in your Info.plist.
    解决:Target-->点击Capabilities-->打开Background Modes-->勾选Remote notification,步骤及最终结果如下图
    图片描述

  • Xcode输出:didFailToRegisterForRemoteNotifications error:未找到应用程序的“aps-environment”的授权字符串
    原因:没有相应的证书
    解决1(传统方法):下载相应的证书-->双击后自动安装-->Build Settings-->Code Signing-->设置Code Signing IdentityProvisioning Profile
    解决2(确保在开发中心已经有对应的证书):点击屏幕左上角的Xcode-->Preferences...(快捷键:command+,)-->选择Apple IDs中你需要的ID-->点击View Details...-->点左下角的刷新按钮。如下面图片操作:
    图片描述
    图片描述

  • 创建通知-->测试预览,出现failed to load certificate, check your APNS certificate;创建通知-->确定推送,出现apns cert error!.
    原因:.pem证书生成时出现错误。信鸽官方解释
    情况一:生成.pem证书时,命令没有输入完全,缺少了 -nodes,完成的命令为:

    openssl pkcs12 -in Your_APNS_DEV.p12 -out Your_APNS_DEV.pem -nodes

    情况二:导出.p12证书时,选中的不是Apple Developmetn IOS Push Services:your.app.bundleidentifier,而是展开有开发者名字的子级。

  • 更多错误信息
    参考:信鸽常见问题与解答

2018-01-31 15:20:59 ZY_FlyWay 阅读数 2779
  • iOS开发教程之OC语言

    Objective-C是扩充C的面向对象编程语言,iOS开发是用的Objective-C语言,本专题更系统的讲解Objective-C语言当中的一些要点,类的封装、基本数据结构(NSString、NSData)、继承、内存管理(retain点语法、MyArray、AutoreleasePool、浅拷贝详述、深拷贝详述)等内容。

    40464 人正在学习 去看看 欧阳坚
前言:
 开始学swift,大家不知道有没有我这个疑问,现在用let var 来给常量变量赋值,那么以前OC那些属性修饰符在swift 是怎么用呢?
 swift let var 是strong 强引用 是weak 弱引用 还是copy 呢。带着这个问题,测试分析一波。

    测试打印程序

先定义一个打印对象地址方法:

swift4.0打印内存地址的方法是: Unmanaged.passUnretained(obj).toOpaque()

swift语言还在改动中,目前已经趋于稳定,4之前的打印地址内存地址方法:%p ,unsafeaddressof 都以无效。

//定义方法打印对象内存地址
func printAddress(values:AnyObject...){
    for value in values {
        print(Unmanaged.passUnretained(value).toOpaque())
    }
    print("-----------------------------------------")
}

验证测试:先看看这个打印方法是不是打印内存地址,而不是指针地址。制作一个单例,然后看看是否使用一块内存。

final class Single:NSObject {
    static let sharedManger = Single()
    private override init(){
    
    }
}
var  sing1 = Single.sharedManger
var  sing2 = Single.sharedManger
var  sing3 = Single.sharedManger
printAddress(values: sing1 as AnyObject,sing2 as AnyObject,sing3 as AnyObject)

打印结果:


step1 :先测试下基本类型 int (float,doule一致)

直接看程序分析结果:

var a1 = 5
let b1 = a1
a1=8
print(a1,b1)
printAddress(values: a1 as AnyObject,b1 as AnyObject)

let a2 = 5
let b2 = a2
print(a2,b2)
printAddress(values: a2 as AnyObject,b2 as AnyObject)

var a = 5
var b = a
a=8
print(a,b)
printAddress(values: a as AnyObject,b as AnyObject)

打印结果:

    

step2 :字符串:string 和nsstring

//string
var str = "hello"
var str1 = str
str = "world"
str1
printAddress(values: str as AnyObject,str1 as AnyObject)

//nsssting
var nsstr = NSString.init(string:"6666")
var nsstr1 = nsstr
nsstr = "ssss"
nsstr1
printAddress(values: nsstr as AnyObject,nsstr1 as AnyObject)

step3:数组、字典、结构体:

//数组
var array  = ["1","2","3"]
var array1 = array
array.remove(at: 2)
print(array.description+"---"+array1.description)
printAddress(values: array as AnyObject,array1 as AnyObject)

//结构体
var  my  =  myStruct()
var  my1 =  my
my.height = 5
print(my1.height)

step4:类对象

class ReferenceObj:NSObject,NSCopying{
    func copy(with zone: NSZone? = nil) -> Any {
        let copyobj = ReferenceObj()
        return copyobj;
    }
    
    var name:String = ""
    var age=0
    var friends:NSArray?
    var skill:Dictionary<String, Any>?
}


var ref  = ReferenceObj();
ref.name = "re1"

var ref1  = ref;
print(ref.name+"\n"+ref1.name)

var ref2  = ref.copy() as! ReferenceObj

printAddress(values: ref as AnyObject,ref1 as AnyObject,ref2 as AnyObject)


分析结果:

      以上类型除了let 赋值let的时候和类对象赋值默认赋值情况下是引用,没有对内存地址进行拷贝。其他情况都会进行地址拷贝。如果类对象进行地址拷贝和oc一样遵循NSCopying协议,对象执行copy方法即可拷贝地址。




2017-04-26 22:11:08 rocklee 阅读数 1104
  • iOS开发教程之OC语言

    Objective-C是扩充C的面向对象编程语言,iOS开发是用的Objective-C语言,本专题更系统的讲解Objective-C语言当中的一些要点,类的封装、基本数据结构(NSString、NSData)、继承、内存管理(retain点语法、MyArray、AutoreleasePool、浅拷贝详述、深拷贝详述)等内容。

    40464 人正在学习 去看看 欧阳坚

   已经不再是简单的赋值了,而且数据拷贝!

func testArray(){
    var a = [1,2,3,4];
    var b = a;
    //a.append(100);
    var c = b;
    c[1] = 20;
    print(a); //[1, 2, 3, 4]
    print(b); //[1, 2, 3, 4]
    print(c); //[1, 20, 3, 4]
}



2018-10-28 18:37:15 huilibai 阅读数 81
  • iOS开发教程之OC语言

    Objective-C是扩充C的面向对象编程语言,iOS开发是用的Objective-C语言,本专题更系统的讲解Objective-C语言当中的一些要点,类的封装、基本数据结构(NSString、NSData)、继承、内存管理(retain点语法、MyArray、AutoreleasePool、浅拷贝详述、深拷贝详述)等内容。

    40464 人正在学习 去看看 欧阳坚

以下内容为swift4.0中的特性

Struct

  • 值类型(内存分配在栈上,赋值或者函数的参数传递时通过拷贝来实现)
  • Copy-on-write: 通过写时复制的方式提升内存的使用效率。在值需要改变的时候才执行拷贝操作。
  • Mutating: 使用mutating来标识需要使用copy-on-write特性
  • 无法继承
  • 不可修改的struct使用let来声明
  • 支持函数式编程: swift函数式编程

Protocol

是一组方法的集合,不能存储数据。可以protocol实现swift中的多重继承

 

protocol优势

1.使API更加灵活

2.通过delegate在View和Controller之间实现关联和结构化通信

3.强制行为,比如Dictionary的key必须遵循hashable协议

4.不同类实现相同的功能,比如String, Array可以执行集合类型的方法。

5.实现多重继承

 

包含可选的方法protocol

  • 通常情况下,protocol中定义的方法都是需要实现的。
  • 如果有可以选择实现的方法,需要在方法前使用optional来声明,有可选方法的protocol需要使用@objc来标明。
  • 如果一个类实现带有可选方法的protocol,这个类一定是NSObject的子类

 

定义protocol

protocol SomeProtocol : InheritedProtocol1, InheritedProtocol2 {
      var someProperty: Int { get set }
      func aMethod(arg1: Double, anotherArgument: String) -> SomeType
      mutating func changeIt()
      init(arg: Type)
}
  • 任何实现了SomeProtocol的数据结构必须要实现InheritedProtocol1和InheritedProtocol2
  • 如果protocol中定义了property,需要指明get和set方法实现哪个或者都需要实现
  • 对于会修改receiver的方法,需要在方法前使用mutating关键字来修饰
  • 如果限制某些protocol只能由class来实现,需要在protocol定义时添加class作为父类
protocol SomeProtocol : class, InheritedProtocol1, InheritedProtocol2 {
      var someProperty: Int { get set }
      func aMethod(arg1: Double, anotherArgument: String) -> SomeType
      mutating func changeIt()
      init(arg: Type)
}
  • protocol中也可以指明需要实现初始化方法

 

实现protocol

  • class, enum, struct都可以实现protocol
class SomeClass : SuperclassOfSomeClass, SomeProtocol, AnotherProtocol {
    // implementation of SomeClass here
    // which must include all the properties and methods in SomeProtocol & AnotherProtocol
}

enum SomeEnum : SomeProtocol, AnotherProtocol {
    // implementation of SomeEnum here
    // which must include all the properties and methods in SomeProtocol & AnotherProtocol
}

struct SomeStruct : SomeProtocol, AnotherProtocol {
    // implementation of SomeStruct here
    // which must include all the properties and methods in SomeProtocol & AnotherProtocol
}
  • class实现的protocol中包含init方法时,需要在init方法前添加required关键字,用于防止该类的子类在继承时忘记实现该方法。
class SomeClass : SuperclassOfSomeClass, SomeProtocol, AnotherProtocol {
    // implementation of SomeClass here, including ...
      required init(...)
}
  • class,struct和enum可以通过extension来实现protocol
extension Something : SomeProtocol {
    // implementation of SomeProtocol here
    // no stored properties though
}

String

字符的集合。和Objc的NSStrinig不同,使用String.Index表示字符在字符串中的索引。

String.Index使用举例如下

let pizzaJoint = “café pesto”
let firstCharacterIndex = pizzaJoint.startIndex // of type String.Index
let fourthCharacterIndex = pizzaJoint.index(firstCharacterIndex, offsetBy: 3) let fourthCharacter = pizzaJoint[fourthCharacterIndex] // é
if let firstSpace = pizzaJoint.index(of: “ “) { // returns nil if “ ” not found let         
    secondWordIndex = pizzaJoint.index(firstSpace, offsetBy: 1)
    let secondWord = pizzaJoint[secondWordIndex..<pizzaJoint.endIndex]
}

NSAttributedString

NSAttibutedString的创建和使用举例

let attributes: [NSAttributedStringKey : Any] = [ // note: type cannot be inferred here
    .strokeColor : UIColor.orange,
    .strokeWidth : 5.0 // negative number here would mean fill (positive means outline) 
]
let attribtext = NSAttributedString(string: “Flips: 0”, attributes: attributes) 
flipCountLabel.attributedText = attribtext // UIButton has attributedTitle

函数类型

函数类型和其他数据类型一样,用于定义变量。

函数声明

func 函数名(行参列表) -> 返回值 {代码实现}

闭包

闭包通常作为函数的参数

闭包使用举例

let primes = [2.0, 3.0, 5.0, 7.0, 11.0]
let negativePrimes = primes.map({ -$0 }) // [-2.0, -3.0, -5.0, -7.0, -11.0]
let invertedPrimes = primes.map() { 1.0/$0 } // [0.5, 0.333, 0.2, etc.]
let primeStrings = primes.map { String($0) } // [“2.0”,”3.0”,”5.0”,”7.0”,”11.0”]

如果函数最后一个参数是闭包,可以将{}部分放到()的外面,如上面的语句3;如果函数只有一个闭包参数,可以将()省略,如上面的语句4。

闭包实现property的延时加载

var someProperty: Type = {
    // construct the value of someProperty here 
    return <the constructed value>
}()

 

2016-12-22 11:40:06 sinat_20037505 阅读数 157
  • iOS开发教程之OC语言

    Objective-C是扩充C的面向对象编程语言,iOS开发是用的Objective-C语言,本专题更系统的讲解Objective-C语言当中的一些要点,类的封装、基本数据结构(NSString、NSData)、继承、内存管理(retain点语法、MyArray、AutoreleasePool、浅拷贝详述、深拷贝详述)等内容。

    40464 人正在学习 去看看 欧阳坚

        // 结构体 ,值类型的赋值操作是深拷贝

        struct Deep {

            var copy: Int = 0

        }

        

        

        // 类,引用类型 的赋值操作是浅拷贝

        class Shallow {

            var copy: Int = 0

        }

        

        var de0 = Deep.init()

        var de1 = Deep.init()

        

        // 数组元素都是值类型

        var dearray = [de0, de1]

        

        

        

        var sh0 = Shallow.init()

        var sh1 = Shallow.init()

        

        // 数组元素都是引用类型

        var sharray = [sh0, sh1]

        

        

        /**

         深拷贝, 这个地方是两个引用指向两个不同的对象。

         因此,我们说值类型 的拷贝它的内存管理非常简单,不需要用ARC什么的来进行处理。

         引用类型的内存管理用 ARC

         */

        var dearray1 = dearray

        var sharray1 = sharray


        

        

//        dearray1.removeLast()

        dearray1[0] = Deep.init(copy: 22)

        print("dearray1.count == \(dearray1.count)")

        print("dearray.count == \(dearray.count)")

        

        

        print("dearray1[0].copy==\(dearray1[0].copy)")

        print("dearray[0].copy==\(dearray[0].copy)")

        

        /**

         dearray1.count == 1

         dearray.count == 2

         

         dearray1.count == 2

         dearray.count == 2

         dearray1[0].copy==22

         dearray[0].copy==0


         当将dearray1数组中的某个元素替换,或者改变了数组的大小,不会影响另外一个数组dearray

         

         1)根据被拷贝的数组大小来创建一个新的数组对象,新的容量跟原始数组大小相同。

         2)将原始数组中的每一个元素依次拷贝到新的数组对象中。

         */

    

        

        

        

        

        dearray1[0].copy = 88

        print("dearray1[0].copy==\(dearray1[0].copy)")

        print("dearray[0].copy==\(dearray[0].copy)")

        /**

         dearray1[0].copy==88

         dearray[0].copy==0

         

         修改副本 属性copy,还是不会影响到原始版本中 copy的值。

         */

        

        

        

        

        

        

        sharray1[0].copy = 99

        print("sharray1[0].copy==\(sharray1[0].copy)")

        print("sharray[0].copy==\(sharray[0].copy)")

        

        /**

         sharray1[0].copy==99

         sharray[0].copy==99

         

         这个元素的内容修改时,也改变了原始版本中元素的内容

         这个数组Array 是深拷贝。

         

         但是数组中的对象是值类型,修改数组中的对象属性,不会修改到另一个版本。

         数组中对象是引用类型,修改数组中的对象属性,还是会修改到另一个版本

         

         */

        

        

        

        


没有更多推荐了,返回首页