在C#中,结构是根据值进行管理的,对象是引用的.根据我的理解,在创建类的实例时,关键字new会导致C#使用类信息来创建实例,如下所示:
class MyClass
{
...
}
MyClass mc = new MyClass();
Run Code Online (Sandbox Code Playgroud)
对于struct,您不是创建对象而只是将变量设置为值:
struct MyStruct
{
public string name;
}
MyStruct ms;
//MyStruct ms = new MyStruct();
ms.name = "donkey";
Run Code Online (Sandbox Code Playgroud)
我不明白的是,如果声明变量by MyStruct ms = new MyStruct(),new这里的关键字是什么?.如果struct不能成为对象,那么new这里实例化是什么?
最近的SO 讨论使我感到困惑.NSMutableArray原型addObject:是
- (void)addObject:(id)anObject
Run Code Online (Sandbox Code Playgroud)
并id在objc.h中定义为
typedef struct objc_class *Class;
typedef struct objc_object {
Class isa;
} *id;
Run Code Online (Sandbox Code Playgroud)
当我将一个NSObject或子类添加到一个时NSMutableArray,它的保留计数会递增,当我从中删除它时,NSMutableArray它会递减.这是否意味着如果一个id type不是一个NSObject或一个子类被添加到一个NSMutableArray,它必须响应保留和释放消息?这个定义id似乎并不强迫这一点.它是一个客观的C指令,任何人id type都应该响应标准的内存管理消息吗?
我正在查看CocoaHTTPServer项目的源代码,更具体地说是HTTPServer.m文件,我只是不明白这一行:
connectionClass = [HTTPConnection self];
Run Code Online (Sandbox Code Playgroud)
这是做什么的(它在任何地方记录)?它甚至如何编译?不应该
connectionClass = [HTTPConnection class];
Run Code Online (Sandbox Code Playgroud) 在Objective C中,协议方法可以是必需的或可选的:
@protocol AProtocol
@required
-(void) aRequiredMethod;
@optional
-(void) anOptionalMethod;
@end
Run Code Online (Sandbox Code Playgroud)
是否有一种优雅的方式来说符合协议的对象必须至少响应一组方法中的一种,我的梦想就像是
@protocol AProtocol
@anyof
-(void) onePossibleMethod;
-(void) anotherPossibleMethod;
@optional
-(void) anOptionalMethod;
@end
Run Code Online (Sandbox Code Playgroud)
编辑:
这是(据我所知),不可能,如果声明符合完全由可选方法完成的给定协议的类,是否有办法提出编译时警告
@protocol AProtocol
@optional
-(void) onePossibleMethod;
-(void) anotherPossibleMethod;
@end
Run Code Online (Sandbox Code Playgroud)
未能实现至少其中一个.
以下是" 块编程指南概念概述"部分的摘录
您可以复制块,甚至将其传递给其他线程以进行延迟执行(或者在其自己的线程内,传递给runloop).编译器和运行时安排在块的所有副本的生命周期内保留从块引用的所有变量.虽然块可用于纯C和C++,但块也始终是Objective-C对象.
我一直试图从最后一句话中弄清楚,但未能成功.句子的第一部分和第二部分似乎与我不相容(我可能遗漏了一些东西).这是否意味着块在C/C++和目标C中不是一回事?这是由于捕获了目标C中的块对象的方式吗?
在使用iOS和Mac目标C框架编程一段时间之后,我开始喜欢NSNotificationCenter和NSNotification类实现的通用通知模式.回到C++,它一直是我大多数事情的首选语言,我发现自己试图复制这种模式,并且相信应该真的已经存在类似C++类的通用实现,为它提供支持.
看起来这种模式在C++中比在Objective C中更难实现,因为后者的动态性更强,但这似乎是不可能的.我已经查看了升级库,因为它们通常很棒,很遗憾没有在那里找到我的运气.虽然boost :: bind,boost :: lamda,boost :: function看起来像是完成了大部分工作.我错过了一些明显的事吗?是否有任何已经存在的内容可以让我轻松复制NSNotification/NSNotificationCenter行为?
c++ notifications objective-c cocoa-design-patterns nsnotificationcenter
关于AVAudioMix和MTAudioProcessingTap的文档很少,它们允许将处理应用于AVFoundation(在iOS上)的媒体资产的音轨(PCM访问).这文章 和简单提一下在WWDC 2012届是我所发现的.
我在这里描述的设置适用于本地媒体文件,但它似乎不适用于远程文件(即HLS流式URL).这是预期的唯一迹象是本技术问答结尾处的注释:
AVAudioMix仅支持基于文件的资产.
有人知道更多吗?当资产不是基于文件时,真的没有办法访问音频PCM数据吗?任何人都可以找到与MTAudioProcessingTap相关的实际Apple文档吗?
有什么不对吗?
#import "SomeCppHeaderFile.h"
Run Code Online (Sandbox Code Playgroud)
在一个客观的C++标题?或者我应该像这样包括(如果cpp标头有通常的#ifndef #define #endif标头gard宏,有什么区别)
#include "SomeCppHeaderFile.h"
Run Code Online (Sandbox Code Playgroud) 我经常发现自己断言Objective-C中某个类的对象"isKindOfClass".我是这样做的:
NSAssert([obj isKindOfClass:[AClass class]], @"%@ should be kind of class %@", obj, [[AClass class] description]);
Run Code Online (Sandbox Code Playgroud)
我想知道为它做出捷径的最好方法.我正在考虑定义一个宏,例如:
#define NSClassAssert(obj, class) NSAssert([obj isKindOfClass:class], @"%@ should be of class %@", obj, [class description])
Run Code Online (Sandbox Code Playgroud)
我担心这可能会导致一些令人讨厌的难以处理的编译错误或运行时问题,这样做是否存在根本性的错误,是否有更明智的方法呢?
我正在尝试编写一个简单的函数=="compareGPA",它比较两个学生的GPA,然后使用选择器按降序排序:[array sortUsingSelector:@selector(compareGPA :)];
我尝试用两种不同的方式编写函数,但没有任何作用,
第一种方式:
+(NSComparisonResult) compareGPA: (Student *) OtherStudent{
Student *tmp =[Student new];
if ([OtherStudent getGpa] < [tmp getGpa]){
return (NSComparisonResult) tmp;
}
if([tmp getGpa] < [OtherStudent getGpa])
{ return (NSComparisonResult) OtherStudent; }
}
Run Code Online (Sandbox Code Playgroud)
第二种方式:
+(NSComparisonResult) compareGPA: (Student *) OtherStudent{
NSComparisonResult res;
res = [[self getGpa] compare: [OtherStudent getGpa]];
return res;
Switch (res)
{
case NSOrderedAscending:
return NSOrderedDescending;
break;
case NSOrderedDescending:
return NSOrderedAscending;
break;
default:
return NSOrderedSame;
break;
}
}
Run Code Online (Sandbox Code Playgroud)
输出:没什么
有什么建议 ??
我已经编写了一个通用的iOS应用程序,可以在我的iPhone和iPad上正常运行,但不是在我的旧iPod touch上.X代码甚至不传输二进制文件.它只是说
在devicename上完成运行程序名
部署目标是4.2.(iPod touch运行4.2.1,它有2.1 GB的可用空间).
我该如何解决这个问题?
我正在审查一些代码并遇到了类似这样的东西(假设它是为TestObject类定义的)
-(id) init
{
if (self == [super init])
{
self.testString = @"Hello";
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
我立刻改变了
if (self == [super init])
Run Code Online (Sandbox Code Playgroud)
至
if (self = [super init])
Run Code Online (Sandbox Code Playgroud)
但后来意识到(虽然我知道它不对)代码工作原样,我在一个超简单的程序中隔离了原始代码
TestObject* testObject = [[TestObject alloc] init];
NSLog(@"%@", testObject.testString);
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,这很有效.为什么等式检查而不是赋值不会破坏事物?为什么是
self == [super init]
Run Code Online (Sandbox Code Playgroud)
在我开始之前,在我分配它之前是真的吗?
我编写了以下代码,迭代元组中的多个扩充.
def div (*tup):
return [x/10 for x in tup]
>>> print div(100,50,30)
[10, 5, 3]
Run Code Online (Sandbox Code Playgroud)
我希望我的输出在列表中显示为三个单独的列表:
[[10], [5], [3]]
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助.
objective-c ×8
ios ×3
class ×2
avfoundation ×1
avplayer ×1
c ×1
c# ×1
c++ ×1
class-method ×1
cocoa ×1
constructor ×1
foundation ×1
httpserver ×1
import ×1
include ×1
initializer ×1
ios6 ×1
macros ×1
nsarray ×1
nsassert ×1
object ×1
protocols ×1
python ×1
struct ×1