精华内容
参与话题
问答
  • Effective Objective-C [下]

    2014-03-13 17:43:54
    Chapter 6: Blocks and Grand Central Dispatch ...《Ry’s Objective-C Tutorial》# Blocks Item 38: Create typedefs for Common Block Types 当我们程序中要使用一些具有共性的Block时(返回值类型、参

    Chapter 6: Blocks and Grand Central Dispatch

    Item 37: Understand Blocks

    《Ry’s Objective-C Tutorial》# Blocks

    Item 38: Create typedefs for Common Block Types

    当我们程序中要使用一些具有共性的Block时(返回值类型、参数个数和类型相同),我们可以给这种Block定义一个类型:

    typedef NSComparisonResult (^NSComparator)(id obj1, id obj2);
    //...
    - (NSArray *)sortedArrayUsingComparator:(NSComparator)cmptr;
    - (void)sortUsingComparator:(NSComparator)cmptr;
    //...
    
    // Simplified with typedef
    typedef void(^EOCCompletionHandler)(NSData *data, NSError *error);
    - (void)startWithCompletionHandler:(EOCCompletionHandler)completion;
    

    国内比较有名的开源框架BeeFramework中就大量应用到Block,并通过类型定义的Block作为属性,实现类似于很多脚本语言方法调用:self.HTTP_GET(URL).PARAM(postDict);, 笔者之前在TouchXML基础上封装了一层W3C标准DOM API时也尝试过这种实现,最后在Objective-C中可以直接这样调用:document.getElementById(@"xxx").setAttribute(@"class", @"xxx"); 是不是有点写JS的赶脚。

    Item 39: Use Handler Blocks to Reduce Code Separation

    当我们要执行一个异步操作,比如异步请求时,通常需要在操作(或请求)完成后将结果返回,在Objective-C中一般有两种实现方式:代理和Block回调。

    代理使用起来比较麻烦,有定义协议,申明代理方法,代理回调、设置代理、实现代理方法等一些列流程,而使用Block回调要简洁得多,我们通常可以申明一个Block类型的属性,在异步操作执行完后调用一下该Block。

    //CXMLHttpRequest.h
    typedef void (^CXMLHttpRequestCallbackBlock) (CXMLHttpRequest *request);
    @interface CXMLHttpRequest : NSObject
    //...
    @property (nonatomic, copy) CXMLHttpRequestCallbackBlock        onreadystatechange;
    //...
    @end
    
    //CXMLHttpRequest.m
    //call when request state changed.
    _onreadystatechange(self);
    
    //User CXMLHttpRequest
    CXMLHttpRequest *request = [CXMLHttpRequest new];
    request.onreadystatechange = ^(CXMLHttpRequest *req) {
        if (req.state == 4 && req.statusCode == 200) {
            //get req.responseText.
        }
    };
    //...
    

    推荐项目:BlocksKit

    Item 40: Avoid Retain Cycles Introduced by Blocks Referencing the Object Owning Them

    由于Block会强引用里面出现的对象,如果Block中使用成员变量,则self本身会被Block强引用,所以稍不注意就会出现Retain Cycle。所以通常避免的方法是在Block中引用对象的值而非对象本身,在非ARC下,可以使用__block关键字来申明需要在Block中引用的对象,这样该对象就不会被Block retain,然后在Block结束时将引用对象设为nil:

    MyViewController * __block myController = [[MyViewController alloc] init…];
    // ...
    myController.completionHandler =  ^(NSInteger result) {
        [myController dismissViewControllerAnimated:YES completion:nil];
        myController = nil;
    };
    

    在ARC模式下,则也可以用__weak(iOS5.0一下版本用__unsafe_unretained)关键字申明一个弱引用对象:

    MyViewController *__weak weakSelf = self;
    self.completionHandler = ^(NSData *data) {
        //...
        [weakSelf clearUp];
    };
    

    Item 41: Prefer Dispatch Queues to Locks for Synchronization

    在多线程环境下,为了保证某些资源操作的可控性,需要给一些方法加锁,保证同时只响应一个对象的调用,通常可以用@synchronized()NSLock

    // @synchronized block
    - (void)synchronisedMethod {
        @synchronized(self) {
            // Safe
        }
    }
    
    // NSLock
    _lock = [[NSLock alloc] init];
    
    - (void)synchronisedMethod {
        [_lock lock];
        // Safe
        [_lock unlock];
    }
    

    我们还可以使用dispatch queue来保证同步操作,首先创建一个dispatch queue,然后将同步操作在该queue中执行:

    // Using GCD queue for synchronisation
    _syncQueue = dispatch_queue_create("com.effectiveobjectivec.syncQueue", NULL);
    
    // …
    
    - (NSString*)someString {
        __block NSString *localSomeString;
        dispatch_sync(_syncQueue, ^{
            localSomeString = _someString;
        });
        return localSomeString;
    }
    
    - (void)setSomeString:(NSString*)someString {
        dispatch_sync(_syncQueue, ^{
            _someString = someString;
        });
    }
    

    Item 42: Prefer GCD to performSelector and Friends

    不在使用GCD时,如果一项任务需要分别在主线程和非主线程中执行,我们需要通过performSelector方法来改变执行的线程,我们还不得不把任务分解成不同的方法,某些方法内的代码在主线程执行,某些在非主线执行:

    - (void)pulldown {
        _indicator.hidden = NO;
        [_indicator startAnimating];
        [self performSelectorInBackground:@selector(download) withObject:nil];
    }
    
    - (void)download {
        NSURL *URL = [NSURL URLWithString:@"http://xxx."];
        NSString *data = [NSString stringWithContentsOfURL:URL encoding:NSUTF8StringEncoding error:nil];
        if (data) {
            [self performSelectorOnMainThread:@selector(reloadData:) withObject:data waitUntilDone:NO];
        }
    }
    
    - (void)reloadData {
        [_indicator stopAnimating];
        _indicator.hidden = YES;
        //refresh view with data.
    }
    

    而如果使用GCD,所有的操作就要简洁很多:

    - (void)pulldown {
        _indicator.hidden = NO;
        [_indicator startAnimating];
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSURL *URL = [NSURL URLWithString:@"http://xxx"];
            NSString *data = [NSString stringWithContentsOfURL:URL encoding:NSUTF8StringEncoding error:nil];
            if (data) {
                dispatch_async(dispatch_get_main_queue(), ^{
                    [_indicator stopAnimating];
                    _indicator.hidden = YES;
                    //refresh view with data.
                });
            }
        };
    }
    

    Item 43: Know When to Use GCD and When to Use Operation Queues

    Item 44: Use Dispatch Groups to Take Advantage of Platform Scaling

    很多情况下我们使用GCD来执行一些异步操作,但是异步操作就存在一个返回顺序问题,如我们需要异步下载3个数据,只有当3个数据都下载完成后才刷新视图,而3个异步下载返回顺序是未知的,这是我们可以使用dispatch group来管理这三个任务:

    dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
        //下载数据1
    });
    dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
        //下载数据2
    });
    dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
        //下载数据3
    });
    
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        //刷新视图
     });
    

    其实熟悉JS或者说熟悉Node.js的人都了解,异步编程下的协同问题一直是比较受关注的话题,其中 Node大牛 @朴灵EventProxy,个人感觉和dispatch group有异曲同工之妙:

    var ep = EventProxy.create("template", "data", "l10n", function (template, data, l10n) {
      _.template(template, data, l10n);
    });
    
    $.get("template", function (template) {
      // something
      ep.emit("template", template);
    });
    $.get("data", function (data) {
      // something
      ep.emit("data", data);
    });
    $.get("l10n", function (l10n) {
      // something
      ep.emit("l10n", l10n);
    });
    

    Item 45: Use dispatch_once for Thread-Safe Single-Time Code Execution

    // `dispatch_once' singleton initialisation
    + (id)sharedInstance {
        static EOCClass *sharedInstance = nil;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            sharedInstance = [[self alloc] init];
        });
        return sharedInstance;
    }
    

    Item 46: Avoid dispatch_get_current_queue

    Chapter 7: The System Frameworks

    Item 47: Familiarize Yourself with the System Frameworks

    《iOS Technology Overview》# Cocoa Touch Frameworks

    Item 48: Prefer Block Enumeration to for Loops

    // Block enumeration
    NSArray *anArray = /* … */;
    [anArray enumerateObjectsUsingBlock:^(id object, NSUInteger idx, BOOL *stop){
        // Do something with `object’
        if (shouldStop) {
            *stop = YES;
        }
    }];
    
    NSDictionary *aDictionary = /* … */;
    [aDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id object, NSUInteger idx, BOOL *stop){
        // Do something with `key’ and `object’
        if (shouldStop) {
            *stop = YES;
        }
    }];
    
    NSSet *aSet = /* … */;
    [aSet enumerateObjectsUsingBlock:^(id object, NSUInteger idx, BOOL *stop){
        // Do something with `object’
        if (shouldStop) {
            *stop = YES;
        }
    }];
    

    Item 49: Use Toll-Free Bridging for Collections with Custom Memory-Management Semantics

    // No-ops for non-retaining objects.
    static const void* EOCRetainNoOp(CFAllocatorRef allocator, const void *value) { return value; }
    static void EOCReleaseNoOp(CFAllocatorRef allocator, const void *value) { }
    
    
    NSMutableArray* EOCNonRetainArray(){
        CFArrayCallBacks callbacks = kCFTypeArrayCallBacks;
        callbacks.retain = EOCRetainNoOp;
        callbacks.release = EOCReleaseNoOp;
        return (NSMutableArray *)CFArrayCreateMutable(nil, 0, &callbacks);
    }
    
    
    NSMutableDictionary* EOCNonRetainDictionary(){
        CFDictionaryKeyCallBacks keyCallbacks = kCFTypeDictionaryKeyCallBacks;
        CFDictionaryValueCallBacks callbacks = kCFTypeDictionaryValueCallBacks;
        callbacks.retain = EOCRetainNoOp;
        callbacks.release = EOCReleaseNoOp;
        return (NSMutableDictionary *)CFDictionaryCreateMutable(nil, 0, &keyCallbacks, &callbacks);
    }
    

    Item 50: Use NSCache Instead of NSDictionary for Caches

    Item 51: Keep initialize and load Implementations Lean

    + (void)load;

    Invoked whenever a class or category is added to the Objective-C runtime; implement this method to perform class-specific behavior upon loading.

    + (void)initialize;

    Initializes the receiver before it’s used (before it receives its first message).

    Item 52: Remember that NSTimer Retains Its Target

    NSTimer会对retain它的Target,所以不要在Target的dealloc中销毁(invalidate)NSTimer对象,因为Timer和Target之间已经形成了Retain cycle,需要在dealloc前就破坏这个Retain cycle。

    我们可以对NSTimer拓展,让它支持调用Block方法:

    // Block support for NSTimer
    #import <Foundation/Foundation.h>
    
    @interface NSTimer (EOCBlocksSupport)
    
    + (void)eoc_scheduledTimerWithTimeInterval:(NSTimeInterval)interval
                                     block:(void(^)())block
                                   repeats:(BOOL)repeats;
    
    @end
    
    @implementation NSTimer (EOCBlocksSupport)
    
    + (void)eoc_scheduledTimerWithTimeInterval:(NSTimeInterval)interval
                                     block:(void(^)())block
                                   repeats:(BOOL)repeats
    {
        return [self scheduledTimerWithTimeInterval:interval
                                             target:self
                               selector:@selector(eoc_blockInvoke:)
                                           userInfo:[block copy]
                                            repeats:repeats];
    }
    
    + (void)eoc_blockInvoke:(NSTimer*)timer {
        void (^block)() = timer.userInfo;
        if (block) {
            block();
        }
    }
    @end
    

    总结

    到这里,全部的代码都过了一遍了,网友@Alfred_Kwong说原书很多内容没有在代码中体现,建议还是读一读原书。其实也是,即使原书所有的内容在代码中都有体现,我也不可能两篇博文就把所有东西总结出来。我更多的是通过该书的52个主题,结合代码,自己对Objective-C内容进行一遍梳理,所以不要因为我这两篇文章来决定你该不该买本书看看,我不想做推销,更不想黑。

    展开全文
  • ——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-一、概述定义:不同对象用自己的方式相应相同的名称的方法的能力叫做多态 多态的本质是动态绑定,程序知道执行时才确定对象所属的类型,是父类...

    一、概述

    定义:不同对象用自己的方式相应相同的名称的方法的能力叫做多态
    多态的本质是动态绑定,程序知道执行时才确定对象所属的类型,是父类指向子类的指针。
    优点:把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。 赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。

    二、多态的代码实现

    动物类Animal有方法run,狗类Dog继承了Animal类,并重写了run方法,添加了新的方法eat
    Animal.h

    #import <Foundation/Foundation.h>
    
    @interface Animal : NSObject
    -(void) run;
    @end

    Animal.m

    #import "Animal.h"
    
    @implementation Animal
    -(void) run{
        NSLog(@"动物在跑...");
    }
    @end

    Dog.h

    #import "Animal.h"
    
    @interface Dog : Animal
    -(void) run;
    -(void) eat;
    @end
    

    Dog.m

    #import "Dog.h"
    
    @implementation Dog
    -(void) run{
        NSLog(@"狗在跑...");
    }
    -(void) eat{
        NSLog(@"狗在吃东西...");
    }
    @end

    main.m

    #import <Foundation/Foundation.h>
    #import "Animal.h"
    #import "Dog.h"
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            // insert code here...
            Animal *a = [Dog new];
            [a run];   //输出:狗在跑...
    
            //[a eat];  //报错(原因是Animal类没有eat方法,必须经过强制类型转换才能通过编译)
            [(Dog *)a eat];   //输出:狗在吃东西...
    
        }
        return 0;
    }

    说明:
    多态中,当子类调用父类中不存在的方法时(即子类新增加的方法),无法通过编译,在编译过程中报错。需要将值类型转换才能通过编译,并可以成功运行。

    错误示例:

    #import <Foundation/Foundation.h>
    #import "Animal.h"
    #import "Dog.h"
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {        
            Animal *a2 = [Animal new];
            [(Dog *) a2 eat]; //可以通过编译,但是运行时报错。        
        }
        return 0;
    }

    说明:栈中的a2指针指向的是堆中的Animal的类,其中的_isa指针指向的是Animal类在代码区中存放的代码,这些代码中并没有eat方法。之所以可以通过编译时因为强制类型转换成Dog类型后,“欺骗”了编译器,使得编译器无法察觉错误。

    三、通过NSObject实例化对象

    所有类都继承自NSObject,可以说NSObject是所有类的基类,可以通过NSObject实例化任何类。

    #import <Foundation/Foundation.h>
    #import "Animal.h"
    #import "Dog.h"
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {        
            NSObject *b = [Dog new];
            [(Dog *) b eat];   //输出:狗在吃东西...        
        }
        return 0;
    }

    四、id类型

    id是一种通用的对象类型,他可以用来存储任何类的对象。也可以理解为万能指针。

    id的定义中已经包含了*号, 指针定义变量时,不需要再加* 号。

    ios5之后推出了instancetype类型,与id类型相比:
    1.都可以作为方法的返回值类型
    2.instancetype可以返回和方法所在类相同类型的对象,id只能返回位置类型的对象。
    3.instancetype只能最为返回值,不能作为参数,而id可以。

    #import <Foundation/Foundation.h>
    #import "Animal.h"
    #import "Dog.h"
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {        
            id obj = [Dog new];
            [obj eat];   //输出:狗在吃东西...        
        }
        return 0;
    }
    

    需要注意的是,和NSObject相比,通过id创建的对象不需要强制类型转换就可通过编译。

    展开全文
  • const const最好理解,修饰的东西不能被修改 指针类型根据位置的不同可以理解成3种情况: I 常量指针 // 初始化之后不能赋值,指向的对象可以是任意对象,对象可变。 ...NSString * const pt1;...

    const

    const最好理解,修饰的东西不能被修改
    指针类型根据位置的不同可以理解成3种情况:

    I 常量指针

    // 初始化之后不能赋值,指向的对象可以是任意对象,对象可变。
    NSString * const pt1;

    II 指向常量的指针

    // 初始化之后可以赋值,即指向别的常量,指针本身的值可以修改,指向的值不能修改
    const NSString * pt2;

    III 指向常量的常量指针

    const NSString *  const pt3;

    extern

    等同于c,全局变量的定义
    //x .h 声明
    extern const NSString * AA;

    //x .m 定义
    const NSString * AA = @"abc";

    // 调用
    #import "x.h"
    或者再次申明
    extern const NSString * AA;

    static

    等同于c,将变量的作用域限定于本文件?
    不同于java C++里面的类变量,oc没有类变量

    疑问

    static const NSString * const ChatWindow_STR_TITLE_INDEX[] = {
        @"msg_type_all", 
        @"msg_type_area", 
        @"msg_type_PM", 
        @"msg_type_team",
        @"guild_title",
        @"msg_type_system",
        @"msg_type_world"
    };

    我在.h文件里定义一个static变量,

    I .h初始化

    在不同的.m里调用都有值,这些值是否同一个对象?

    【不同的对象】

    II .m里初始化(or赋值)

    初始化的值只在.m文件里有效果,即等同于c,将变量的作用域限定于本文件

    其他.m文件调用的值都没有赋值。

    【不同的对象】


    结论

    static

        // static变量属于本类,不同的类对应的是不同的对象

        // static变量同一个类所有对象中共享,只初始化一次

    const

        // static const变量同static的结论I,只是不能修改了,但是还是不同的对象

        // extern const变量只有一个对象,标准的常量的定义方法

        // extern的意思就是这个变量已经定义了,你只负责用就行了



    展开全文
  • 类的声明 — 类名.h @interface Person : NSObject { /*实例变量*/ int age; int identify; // 与java不同,实例变量不能在这里初始化 } /*方法声明*/ /** - (void) m

    类的声明 — 类名.h

         @interface Person : NSObject
         {
              /*实例变量*/
              int age;
              int identify;
              // 与java不同,实例变量不能在这里初始化
         }
         /*方法声明*/
         /** 
           - (void) main:(String) args
           + ……
           - 表示实例方法, + 表示类方法(静态方法)
           (void) 返回类型
           main: 方法名,注意这个冒号
           (String) args 参数
         */
         - (void) setAge:(int) _age;
         - (int) getAge;
         // oc方法声明 之 怪异声明方式
         - (id) initWithAge:(int) _age identify:(int) identify;
    
         @end
    类的实现 — 类名.m

         #import "Person.h"
         @implementation Person
         // 初始化方法,类似Java的构造方法
         -(id) initWithAge:(int)_age identify:(int)_identify
         {
              if (self = [super init]) {
                   age = _age;
                   identify = _identify;
              }
              return self;
         }
         -(int) getAge
         {
              return age;
         }
         -(int) getIdentify
         {
              return identify;
         }
         -(void) setAge:(int)_age
         {
              age = _age;
         }
         @end


    展开全文
  • 语法基础——Objective-C语法基础

    万次阅读 多人点赞 2017-02-21 19:37:29
    学习过Swift之后,好久没用已经生疏了,现在有项目来了,不得不停下手下的工作,开始学习OC,当然这篇文章会以Java基础和C基础作为支撑,这样学习起来入门很简单,可能这篇文章有点个人主义,用作个人笔记吧 ...
  • Objective-C学习之路-由浅入深

    万次阅读 多人点赞 2017-02-09 16:18:21
    一、Objective-C简介Objective-C 简称OC /Obj-c Objective 是面向对象的,OC是在C语言的基础上添加了一些新的面向对象的语法,比较繁琐的语法封装的更为简单,所以在学习Objective-C之前大家必须去学习C语言一些...
  • ObjectiveC类的使用

    2015-04-04 12:05:39
    基本使用 lijun.h // // Header.h // example // // Created by junli on 15/4/3. // Copyright (c) 2015年 junli. All rights reserved. // #ifndef example_Header_h #define example_Header_h /* Title:demo
  • objective c中的数组和简单操作(四)

    万次阅读 2012-03-13 09:03:33
    holydancer原创,如需转载,请在显要位置注明: ... 更多内容访问:这里 ...在objective c中,除了C的数组使用方法,Cocoa还为我们提供了一个NSArray类,使用该类可以简单方便的存储对象,该类同NSMutabl...
  • 最近在ubuntu学习 objective c,于是找到了下面的办法 ,懒得翻译了,哈哈,这样学习objective c就暂时不用弄虚拟机了。 Objective C is the primary language for developing software...
  • objective C 随机数

    千次阅读 2011-10-08 13:33:49
    java随机数可能为负数 objective C :大于32767的int型数(RAND_MAX+1=32768)为负数。  Objective-C 没有提供相关的函数生成随机数,不过C供了rand(), srand(), random(), srandom(),
  • Windows搭建ObjectiveC开发环境

    千次阅读 2011-11-20 19:56:07
    1. 安装 GNUstep, 四个软件安装包:GNUstep MSYS System、GNUstep Core、GNUstep Devel、Cairo Backend ,官网下载地址:... 。 2.编写一个Objective C代码进行编译运行测试。 建立一个文件夹ObjectiveCPorje
  • 关于OC中类的声明和使用 1:声明  @interface className {  propertyType propertyName; } -(void)setPropertyName:(int)name; @end; 2:组合合成 ... -(void)setPropertyName:
  • objective c 截屏代码

    2010-10-16 19:47:09
    objective c 截屏代码 -(void)save{ UIGraphicsBeginImageContext(mybackgroundview.bounds.size); //currentView 当前的view [mybackgroundview.layer renderInContext:UIGraphicsGetCurrentContex...
  • 今天花了了一个下午的时间看完了《Objective-C开发范例代码大全》,这本书适合有无基础的程序员,内容由浅到深,讲述了Mac和ios开发的常见问题的解决方法,参考德雷福斯模型的五个阶段,这本书适合新手,可以方便...
  • ObjectiveC基础教程(第2版)》 基本信息 原书名:Learn objectiveC on the mac:For OSX and iOS 作者: (美)克纳斯特 马利克 达尔林普尔 译者: 周庆成 丛书名...
  • objectiveC中@[]的使用

    2013-03-27 03:23:38
    见过这样的用法: NSArray *objectsToShare = @[objects]; 看了一些示例代码,`@[objects]`是什么意思?
  • hi,本人只能添加一个动画到view中,但是需求是添加多个。 请高手帮忙。 ... [UIView beginAnimations:nil context:nil];... [UIView setAnimationDuration:kAnimationDuration];... //self.square.bounds = CGRectMake...
  • Objective C 之 基础设计模式 (MVC)

    千次阅读 2012-02-05 10:37:55
    Cocoa是Mac OS和iPhone OS上的开发框架,使用Objective-C做为开发语言。当然,在代码中也可以嵌入C和C++的语句。初识Objective-C时会觉得它的语法很奇怪,但本质上和其他面向对象语言都差不多。具体语法大家可以参考...
  • 需要动态生成json字符串然后发送到服务器,不知道应该怎么实现? 使用了`NSJSONSerialization `。 下面就是字符串: { "surveyid": "Survey1", "responsetime": "dd/mm/yyyy hh:mm:ss", ...谢谢
  • 代码质量管理SonarQube实现Objective C静态代码扫描环境搭建总结
  • Objective-C通过一套全新语法,在C语言基础上添加了面向对象特性。Objective-C的语法中频繁使用方括号,且不吝于写出极长的方法名。 第1条:了解Objective-C语言的起源 所有Objective-C语言的对象都必须像这样声明...
  • Swift是对ObjectiveC进行的封装,而且目前许多的第三方SDK以及第三方开源库都使用的ObjectiveC语言进行编写,因此许多的时候都需要Swift调用ObjectiveC内的方法。 下面简单的介绍下如何实现Swift调用ObjectiveC内的...
  • 47down voteaccepted "nil" should only be used in place of an "id", what we Java and C++ programmers would think of as a pointer t
  • 推荐一本Objective C的好书

    千次阅读 2013-12-27 17:15:33
    iOS 7 Programming Fundamentals: Objective-C, Xcode, and Cocoa Basics Author: Matt Neuburg Publisher: O'Reilly Media Released: October 2013 Pages: 422 Details:  If you’re getting ...
  • Qt for iOS,Qt 与Objective C混合编程

    万次阅读 2015-02-02 07:45:16
    介绍如何在 Qt 项目里使用 Objective C,介绍如何在 Qt Quick 界面上叠加 iOS 原生界面……
  •  最近打算针对iPhone、iPod touch和iPad开发一些应用,所以,需要开始学习Objective C(苹果推出的类似C语言的开发语言)。由于苹果的自我封闭的产业链发展模式(从芯片、机器、开发语言、终端产品、服务)的...
  • Objective-C语言是一种通用的、面向对象编程的语言,Smalltalk风格消息传送到C编程语言。它是使用苹果OS X和iOS操作系统及各自的API,Cocoa 和 Cocoa Touch的编程语言。  Cocoa和ObjectiveC是苹果公司OS X和iOS...
  • 很多人想学习iOS开发,但是不知道如何从Objective-C和Swift之间选择。而网上的一些答案,大抵说的是,以后Swift终将取代Objective-C,但是目前来讲还是Objective-C比较重要。那么究竟怎样呢,今天我们就来探讨下
  • 优雅的开发Swift和Objective C混编的Framework

    万次阅读 热门讨论 2017-03-02 16:41:58
    前言为什么要写这样一篇文章,因为昨天和一个朋友讨论到Swift和Objective C如何混合开发Framework,中途发现了很多有意思的坑。用Swift封住哪个OC的库是一件比较常见的事情,毕竟对于大多数公司来说,老的代码都是用...
  • 苹果官方的objective c文档

    千次阅读 2017-11-24 14:17:36
    Programming with Objective-C https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/Introduction/Introduction.html Object-Oriented P

空空如也

1 2 3 4 5 ... 20
收藏数 148,151
精华内容 59,260
关键字:

objectivec